package ec.edu.ups.cidi.siia.plamdep.ejecutor.GestionAlgoritmos;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import ec.edu.ups.cidi.siia.plamdep.algoritmos.NGramasExtract;
import ec.edu.ups.cidi.siia.plamdep.algoritmos.VectorSpaceModel;
import ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.AlgoritmoComparacion;
import ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.AlgoritmoExtraccion;
import ec.edu.ups.cidi.siia.plamdep.utils.Log;

public class CargaJAR {

	public Object cargarJAR(String ruta, String className) {
		try {
			addFile(ruta);
			Class cl = CargaJAR.class.getClassLoader().loadClass(className);// ClassLoader.getSystemClassLoader().loadClass(className);
			Object o = cl.newInstance();
			return o;
		} catch (Exception e) {
			Log.log(e,Log.MOD_CARGA_JAR,Log.LEVEL_ERROR, CargaJAR.class,"error al cargar JAR" );
			return null;
		}
	}

	private final Class<?>[] parameters = new Class[] { URL.class };

	/**
	 * Adds a file to the classpath.
	 * 
	 * @param s
	 *            a String pointing to the file
	 * @throws IOException
	 */
	public void addFile(String s) throws IOException {
		File f = new File(s);
		addURL(f.toURI().toURL());

	}

	/**
	 * Adds the content pointed by the URL to the classpath.
	 * 
	 * @param u
	 *            the URL pointing to the content to be added
	 * @throws IOException
	 */
	public void addURL(URL u) throws IOException {
		URLClassLoader sysloader = (URLClassLoader) ClassLoader
				.getSystemClassLoader();
		Class<?> sysclass = URLClassLoader.class;
		try {
			Method method = sysclass.getDeclaredMethod("addURL", parameters);
			method.setAccessible(true);
			method.invoke(sysloader, new Object[] { u });
		} catch (Throwable t) {
			Log.log(null,Log.MOD_CARGA_JAR,Log.LEVEL_ERROR, CargaJAR.class,"error al cargar JAR" );
			throw new IOException(
					"Error, could not add URL to system classloader");
		}// end try catch
	}// end method

	public AlgoritmoComparacion loadAlgoritmoComparacion(
			AlgComparacionContainer contenedor) {
		
		Log.log(null,Log.MOD_CARGA_JAR,Log.LEVEL_MSG, CargaJAR.class,"Cargando algoritmo de comparacion: "+ contenedor.nombre );
//		Object obj = this.cargarJAR(contenedor.rutaAlgoritmo,	contenedor.className);
		Object obj =new VectorSpaceModel();
		contenedor.setAlgoritmo((ec.edu.ups.cidi.siia.plamdep.modelo.algortimos.AlgoritmoComparacion) obj);

		GestorAlgoritmos.addAlgoritmoComparacion(contenedor);
		return (AlgoritmoComparacion) obj;
	}

	public AlgoritmoExtraccion loadAlgoritmoExtraccion(
			AlgExtractorContainer contenedor) {
		
		Log.log(null,Log.MOD_CARGA_JAR,Log.LEVEL_MSG, CargaJAR.class,"Cargando algoritmo de extracion: "+ contenedor.nombre);
		//Object obj = this.cargarJAR(contenedor.rutaAlgoritmo,contenedor.className);
		Object obj =new NGramasExtract();
		contenedor.setAlgoritmo((AlgoritmoExtraccion) obj);
		GestorAlgoritmos.addAlgoritmoExtraccion(contenedor);
		return (AlgoritmoExtraccion) obj;
	}

}